package com.kx.my02;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

import java.util.Date;

/**
 * @Aspect：是aspectj框架中的注解。 作用：表示当前类是切面类。
 * 切面类：是用来给业务方法增加功能的类，在这个类中有切面的功能代码
 */
@Aspect
public class MyAspect {
    /**
     * 后置通知定义方法，方法是实现切面功能的。
     * 方法的定义要求：
     * 1、公共方法public
     * 2、方法没有返回值
     * 3、方法名称自定义
     * 4、方法有参数的，推荐是Object，参数名自定义
     */
    /**
     * @AfterReturning:后置通知 属性：
     * 1、value切入点表达式
     * 2、returning自定义的变量，表示目标方法的返回值的。
     * 自定义变量名必须和通知方法的形参名一样
     * 特点：
     * 1、能够获取到目标方法的返回值，可以根据这个返回值做不同的处理功能
     * 2、可以修改此返回值
     * 后置通知的执行
     *  Object res=doOther();
     *  参数传递：传值，传引用
     *  myAfterReturning(res);
     */
    @AfterReturning(value = "execution(* *..SomeServiceImpl.doOther(..))", returning = "res")
    public void myAfterReturning(Object res) {
        System.out.println("1====后置通知，切面功能：在目标方法后输出返回值：" + res);
        if ("abcd".equals(res)) {
            //做一些功能
            res="sad";
            System.out.println(res);
        } else {
            //做其他功能
        }

        //修改目标方法的返回值，看一下是否会影响最后的方法调用结果
        if (res != null){
            res = "Hello Aspectj";
        }
    }
    @AfterReturning(value = "execution(* *..SomeServiceImpl.doOther2(..))", returning = "res")
    public void myAfterReturning1(JoinPoint jp,Object res) {
        System.out.println("后置通知：方法的定义"+jp.getSignature());
        System.out.println("后置通知：方法的名称"+jp.getSignature().getName());
        System.out.println("1====后置通知，切面功能：在目标方法后输出返回值：" + res);

        //修改目标方法的返回值，看一下是否会影响最后的方法调用结果
        if (res != null){
            Student student= (Student) res;
            student.setAge(20);
        }
    }
}
